package com.adee.jvm;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/**
 * 有道云笔记jvm案例测试
 * http://note.youdao.com/noteshare?id=52f9db5195495788c274b8bd112f97b1&sub=B7D531529349491388D61B6D2608E18B
 * 模拟频繁full gc场景：
 * 1. 方法中局部变量对象较多，占用空间较大；
 * 2. 必须为高并发，以出现”恰巧minor gc时，方法没有执行完“；
 * 3. survivor区设置较小，使得一个方法中的所有对象占用空间超过survivor大小的50%。
 */
public class Test004_FullGC {
    public static void main(String[] args) {
        ExecutorService tp = Executors.newFixedThreadPool(50);
        for (;;) {
            try {
                TimeUnit.MILLISECONDS.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            tp.execute(new BigGcRootsTask());
        }

    }

    static class BigGcRootsTask implements Runnable {

        @Override
        public void run() {
            // 1. 方法中局部变量对象较多，占用空间较大；
            List<int[]> list = new ArrayList<>();
            // 8m
            for (int i = 0; i < 200; i++) {
                // 40k
                for (int j = 0; j < 1000; j++) {
                    list.add(new int[10]);
                }
            }
            list.forEach(i -> {
                i[0] = 1;
            });
        }
    }
}
